package com.zjsru.plan2023.oneday;

import java.util.Arrays;

/**
 * @Author: CookLee
 * @Date: 2023/6/14
 * 二进制字符串前缀一致的次数
 *
 *  输入：flips = [3,2,4,1,5]
 * 输出：2
 * 解释：二进制字符串最开始是 "00000" 。
 * 执行第 1 步：字符串变为 "00100" ，不属于前缀一致的情况。
 * 执行第 2 步：字符串变为 "01100" ，不属于前缀一致的情况。
 * 执行第 3 步：字符串变为 "01110" ，不属于前缀一致的情况。
 * 执行第 4 步：字符串变为 "11110" ，属于前缀一致的情况。
 * 执行第 5 步：字符串变为 "11111" ，属于前缀一致的情况。
 * 在翻转过程中，前缀一致的次数为 2 ，所以返回 2 。
 *
 * 输入：flips = [4,1,2,3]
 * 输出：1
 * 解释：二进制字符串最开始是 "0000" 。
 * 执行第 1 步：字符串变为 "0001" ，不属于前缀一致的情况。
 * 执行第 2 步：字符串变为 "1001" ，不属于前缀一致的情况。
 * 执行第 3 步：字符串变为 "1101" ，不属于前缀一致的情况。
 * 执行第 4 步：字符串变为 "1111" ，属于前缀一致的情况。
 * 在翻转过程中，前缀一致的次数为 1 ，所以返回 1 。
 *
 */
public class NumTimesAllBlue {
    
    /**
     * 暴力枚举
     *
     * @param flips 翻转
     * @return int
     */
    public int numTimesAllBlue(int[] flips) {
        int count = 0;
        int[] nums = new int[flips.length];
        Arrays.fill(nums,0);
        for (int i = 0; i < flips.length; i++) {
            int flipNum = flips[i];
            nums[flipNum - 1] = 1;
            boolean helper = this.helper(nums, i);
            if(helper){
                count++;
            }
        }
        return count;
    }
    
    /**
     * 规则判断枚举类
     *
     * @param nums 全国矿工工会
     * @param num  全国矿工工会
     * @return boolean
     */
    private boolean helper(int[] nums, int num) {
        StringBuilder sb = new StringBuilder();
        for (int one : nums) {
            sb.append(one);
        }
        if (!sb.substring(0, num + 1).contains("0") && !sb.substring(num  + 1).contains("1")) {
            return true;
        }
        return false;
    }
    
    /**
     * 数学
     * 前 i 次翻转中下标的最大值等于 i 即可保证前i次都翻转了
     *
     * @param flips 翻转
     * @return int
     */
    public int numTimesAllBlue2(int[] flips) {
        int count = 0;
        int len = flips.length;
        int right = 0;
        for (int i = 0; i < len; i++) {
            right = Math.max(right, flips[i]);
            //翻转位数从1开始，故+1
            if (right == i + 1) {
                count++;
            }
        }
        return count;
        
    }
    
    public static void main(String[] args) {
        NumTimesAllBlue numTimesAllBlue = new NumTimesAllBlue();
        int[] flips = new int[] {3, 2, 4, 1, 5};
        System.out.println(numTimesAllBlue.numTimesAllBlue(flips));
    }
    
}
